前面花了一些時間講要做的細項
今天終於可以進到修改資料了
UI部分,在每個category後面加個 修改 按鈕
url: http://localhost:8000/store/categoryUpdate/1/
route 需要 id 參數 才知道 修改哪一筆資料
<int:id> 只有int 才可以 命變數為id
store/urls.py
...
path('categoryUpdate/<int:id>/', views.categoryUpdate, name='categoryUpdate')
...
{% url '' <parm> %} 第二個參數就是 對應到route id
store/templates/store/category.html
...
<td><a href="{% url 'store:categoryUpdate' category.id %}">
<button>修改</button></a>
</td>
...
funcName(request, id) id 對應到route
<model>.objects.get(id=id) 抓一筆資料,回傳一個物件
<modelForm>(instance=<model>) 塞那筆資料的所有欄位,在html 就會帶入了
store/views.py
def categoryUpdate(request, id):
category = Category.objects.get(id=id)
if request.method == 'GET':
categoryForm = CategoryForm(instance=category)
return render(request, 'store/categoryUpdate.html', {'categoryForm': categoryForm})
elif request.method == 'POST':
categoryForm = CategoryForm(request.POST, instance=category)
if not categoryForm.is_valid():
return render(request, 'store/categoryUpdate.html', {'categoryForm':categoryForm})
categoryForm.save()
messages.success(request, '修改成功')
return redirect(reverse('store:category'))
這樣就完成了
有一個小小的問題就是
如果 路徑被使用者亂改,改成資料庫沒有的id的話,<model>.objects.get(id=id) 這樣會出錯
會得到 server 500
http://localhost:8000/store/categoryUpdate/10000/
可以把抓資料庫改成 get_object_or_404(Category, id=id)
如果沒資料會變成page not found 404
第一個參數model
第二個參數是條件
store/views.py
from django.shortcuts import render, redirect, get_object_or_404
...
def categoryUpdate(request, id):
category = get_object_or_404(Category, id=id)
...
未來可以自己定義404頁面,更好的使用者體驗